Skill
আনসিবল (Ansible)

Ansible এর ইনস্টলেশন এবং সেটআপ

Latest Technologies - আনসিবল (Ansible) - NCTB BOOK

Ansible ইনস্টলেশন এবং সেটআপ খুবই সহজ, এবং এটি সাধারণত আপনার লোকাল মেশিনে বা কন্ট্রোল মেশিনে ইনস্টল করা হয়, যেখান থেকে আপনি রিমোট সার্ভারগুলোকে পরিচালনা করবেন। নিচে বিভিন্ন প্ল্যাটফর্মে Ansible ইনস্টল করার ধাপগুলো দেওয়া হলো:

1. Ansible ইনস্টলেশন (Ubuntu/Debian)

ধাপ ১: প্যাকেজ আপডেট করুন

প্রথমে আপনার প্যাকেজ ম্যানেজার আপডেট করুন:

sudo apt update

ধাপ ২: Ansible ইনস্টল করুন

sudo apt install ansible -y

ধাপ ৩: ইনস্টলেশন চেক করুন

ইনস্টলেশন ঠিকমতো হয়েছে কিনা তা যাচাই করার জন্য কমান্ড দিন:

ansible --version

2. Ansible ইনস্টলেশন (CentOS/RHEL)

ধাপ ১: EPEL রিপোজিটরি ইনস্টল করুন

sudo yum install epel-release -y

ধাপ ২: Ansible ইনস্টল করুন

sudo yum install ansible -y

ধাপ ৩: ইনস্টলেশন চেক করুন

ansible --version

3. Ansible ইনস্টলেশন (macOS)

macOS-এ Ansible ইনস্টল করতে Homebrew ব্যবহার করতে পারেন।

ধাপ ১: Homebrew আপডেট করুন

brew update

ধাপ ২: Ansible ইনস্টল করুন

brew install ansible

ধাপ ৩: ইনস্টলেশন চেক করুন

ansible --version

4. Ansible কনফিগারেশন এবং সেটআপ

Ansible ইনস্টল করার পর, আপনাকে ইনভেন্টরি এবং কনফিগারেশন ফাইল সেটআপ করতে হবে:

ধাপ ১: ইনভেন্টরি ফাইল তৈরি করুন

ডিফল্টভাবে Ansible এর ইনভেন্টরি ফাইল /etc/ansible/hosts এই লোকেশনে থাকে। তবে আপনি নিজের ইচ্ছামত অন্য কোনো লোকেশনে এটি তৈরি করতে পারেন। ইনভেন্টরি ফাইলে আপনি রিমোট সার্ভারগুলোর তালিকা সংরক্ষণ করবেন।

sudo nano /etc/ansible/hosts

ইনভেন্টরি ফাইলে হোস্টের তালিকা দিন:

[webservers] 192.168.1.10 192.168.1.11 [dbservers] 192.168.1.12

ধাপ ২: SSH কনফিগারেশন

Ansible এজেন্টলেসভাবে SSH ব্যবহার করে রিমোট সার্ভারে কাজ করে। তাই আপনার কন্ট্রোল মেশিন থেকে রিমোট সার্ভারগুলোতে SSH এক্সেস থাকতে হবে। SSH কী পেয়ার তৈরি করে তা রিমোট সার্ভারে কপি করুন:

ssh-keygen
ssh-copy-id user@remote_server_ip

ধাপ ৩: Ansible কনফিগারেশন ফাইল আপডেট করুন (ঐচ্ছিক)

Ansible এর কনফিগারেশন ফাইল /etc/ansible/ansible.cfg এ থাকে। আপনি এই ফাইলে ডিফল্ট সেটিংস পরিবর্তন করতে পারেন, যেমন ইনভেন্টরি ফাইলের পাথ, SSH কনফিগারেশন ইত্যাদি।

ধাপ ৪: একটি টেস্ট রান করুন

আপনি একটি পিং টেস্ট দিয়ে যাচাই করতে পারেন যে Ansible রিমোট সার্ভারের সাথে সঠিকভাবে যোগাযোগ করতে পারছে কিনা:

ansible all -m ping

যদি সবকিছু ঠিকমতো কনফিগার করা থাকে, তবে আপনি "pong" আউটপুট পাবেন।

Ansible ইনস্টলেশন (Linux, Windows, macOS)

Ansible ইনস্টলেশন করতে চাইলে, আপনি আপনার অপারেটিং সিস্টেম অনুযায়ী নিচের ধাপগুলি অনুসরণ করতে পারেন। Ansible সাধারণত Linux সিস্টেমে সহজে ইনস্টল করা যায়, কিন্তু Windows এবং macOS-এও এটি ব্যবহার করা সম্ভব। নিচে প্রতিটি অপারেটিং সিস্টেমের জন্য ইনস্টলেশন প্রক্রিয়া দেওয়া হল:

১. Linux এ Ansible ইনস্টলেশন:

Linux-এ Ansible ইনস্টল করা খুবই সহজ এবং এর জন্য বিভিন্ন প্যাকেজ ম্যানেজার ব্যবহার করা হয়। এখানে Ubuntu/Debian এবং CentOS/RHEL-এর জন্য পদ্ধতি দেওয়া হলো।

Ubuntu/Debian:

sudo apt update
sudo apt install ansible -y

CentOS/RHEL:

sudo yum install epel-release -y
sudo yum install ansible -y

Fedora:

sudo dnf install ansible -y

টিপস: Ansible ইনস্টল করার পর, ইনস্টলেশন সঠিক হয়েছে কিনা তা পরীক্ষা করতে নিচের কমান্ডটি চালাতে পারেন:

ansible --version

২. Windows এ Ansible ইনস্টলেশন:

Windows-এ সরাসরি Ansible ইনস্টল করা যায় না, তবে Windows Subsystem for Linux (WSL) বা Virtual Machine (VM) ব্যবহার করে Linux পরিবেশে Ansible ইনস্টল করা যায়।

WSL ব্যবহার করে ইনস্টলেশন:

১. Windows 10/11-এ WSL সক্রিয় করতে নিচের কমান্ডগুলি Powershell (Admin) থেকে চালান:

wsl --install

২. WSL ইনস্টল করার পর, একটি Ubuntu বা অন্য কোনো Linux ডিস্ট্রো ইনস্টল করুন।

৩. Linux Shell চালু করুন এবং Linux-এর মতোই Ansible ইনস্টল করুন:

sudo apt update
sudo apt install ansible -y

টিপস: WSL-এ Ubuntu চালানোর মাধ্যমে আপনি Linux-এর মতো সকল কমান্ড এবং সুবিধা ব্যবহার করতে পারবেন।

৩. macOS এ Ansible ইনস্টলেশন:

macOS-এ Ansible ইনস্টল করার জন্য Homebrew সবচেয়ে সহজ পদ্ধতি।

Homebrew ব্যবহার করে ইনস্টলেশন:

১. প্রথমে Homebrew ইনস্টল করুন (যদি আগে ইনস্টল না থাকে):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

২. এরপর Ansible ইনস্টল করুন:

brew install ansible

টিপস: ইনস্টলেশন ঠিকভাবে হয়েছে কিনা, তা পরীক্ষা করতে:

ansible --version

এইভাবেই আপনি বিভিন্ন অপারেটিং সিস্টেমে Ansible ইনস্টল করতে পারেন।

Ansible কনফিগারেশন ফাইল (ansible.cfg)

Ansible কনফিগারেশন ফাইল (ansible.cfg) Ansible-এর জন্য বিভিন্ন সেটিংস এবং ডিফল্ট ভ্যারিয়েবল নির্ধারণ করে, যা Ansible প্লেবুক, মডিউল এবং ইনভেন্টরি ব্যবহারের সময় কার্যকর হয়। সাধারণত, এটি Ansible প্রজেক্টের রুট ডিরেক্টরি বা /etc/ansible/ ডিরেক্টরিতে থাকে। আপনি চাইলে আপনার হোম ডিরেক্টরিতে বা কোনো নির্দিষ্ট প্রজেক্টের ডিরেক্টরিতে এটি রাখতে পারেন।

ansible.cfg ফাইলের বিভিন্ন সেকশন থাকে, যা Ansible এর আচরণ কনফিগার করতে ব্যবহৃত হয়। নিচে একটি সাধারণ কনফিগারেশন ফাইলের উদাহরণ এবং প্রতিটি সেকশনের ব্যাখ্যা দেওয়া হলো:

একটি সাধারণ ansible.cfg ফাইলের উদাহরণ:

[defaults]
inventory = ./inventory
remote_user = ansible_user
ask_pass = false
private_key_file = ~/.ssh/id_rsa
host_key_checking = false
timeout = 30

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
pipelining = true

ansible.cfg এর সেকশন এবং সেটিংস:

১. [defaults]: এটি Ansible-এর সাধারণ ডিফল্ট সেটিংস এবং অপশন নির্ধারণ করে।

  • inventory: ইনভেন্টরি ফাইলের লোকেশন নির্ধারণ করে যেখানে হোস্টগুলোর তথ্য থাকে।
  • remote_user: রিমোট হোস্টে লগইন করার জন্য ডিফল্ট ইউজার।
  • ask_pass: যদি সত্য (true) হয়, তবে পাসওয়ার্ড চাইবে; SSH key ব্যবহার করলে এটি false রাখা হয়।
  • private_key_file: SSH প্রাইভেট কী এর পাথ নির্ধারণ করে।
  • host_key_checking: যদি false করা হয়, তাহলে Ansible হোস্ট কী চেকিং বাদ দেবে।
  • timeout: রিমোট হোস্টের সাথে কানেকশনের সময়কাল নির্ধারণ করে (সেকেন্ডে)।

২. [privilege_escalation]: Ansible-এর প্রিভিলেজ এস্কেলেশন সম্পর্কিত সেটিংস।

  • become: এটি true করলে Ansible প্রিভিলেজ এস্কেলেশন (sudo) ব্যবহার করবে।
  • become_method: কোন মেথড ব্যবহার করবে (ডিফল্ট হল sudo)।
  • become_user: কোন ইউজার হিসেবে কমান্ড রান করবে (ডিফল্ট হল root)।
  • become_ask_pass: এটি যদি true হয়, তবে sudo পাসওয়ার্ড চাইবে।

৩. [ssh_connection]: SSH সংযোগের জন্য কনফিগারেশন।

  • ssh_args: SSH সংযোগের জন্য অতিরিক্ত আর্গুমেন্ট।
  • pipelining: এটি true করলে কমান্ডগুলো দ্রুত রান হয়, কারণ এটি SSH সংযোগের সংখ্যাকে কমিয়ে আনে।

ansible.cfg কনফিগারেশন ফাইলের অবস্থান:

Ansible কনফিগারেশন ফাইলের কয়েকটি সাধারণ অবস্থান রয়েছে। Ansible এই ফাইলগুলো ক্রমানুসারে চেক করে:

  1. ANSIBLE_CONFIG এনভায়রনমেন্ট ভ্যারিয়েবল (যদি সেট করা থাকে)।
  2. ansible.cfg (বর্তমান ডিরেক্টরি বা প্রজেক্ট ডিরেক্টরি)।
  3. ~/.ansible.cfg (ইউজারের হোম ডিরেক্টরি)।
  4. /etc/ansible/ansible.cfg (গ্লোবাল কনফিগারেশন ফাইল)।

টিপস:

  • ansible.cfg ফাইল কাস্টমাইজ করার সময়, নিশ্চিত হন যে সেটিংসগুলো সঠিকভাবে করা হয়েছে, কারণ ভুল সেটিংস প্লেবুক রান বা হোস্ট কানেকশনে সমস্যা সৃষ্টি করতে পারে।
  • আপনি চাইলে আপনার প্রোজেক্ট অনুযায়ী আলাদা ansible.cfg ব্যবহার করতে পারেন, যা শুধু সেই নির্দিষ্ট প্রোজেক্টের জন্য প্রযোজ্য হবে।

এভাবেই আপনি Ansible কনফিগারেশন ফাইল ব্যবহার করে আপনার ডিফল্ট সেটিংস কাস্টমাইজ এবং নিয়ন্ত্রণ করতে পারেন।

ইনভেন্টরি ফাইল এবং এর ফরম্যাট

Ansible ইনভেন্টরি ফাইল হল একটি ফাইল যেখানে আপনি আপনার ম্যানেজড হোস্ট বা সার্ভারের তালিকা রাখেন। এই ফাইলের মাধ্যমে Ansible জানে কোন হোস্টগুলির সাথে যোগাযোগ করতে হবে এবং কোন গ্রুপে কোন হোস্ট আছে। ইনভেন্টরি ফাইলটি সাধারণত /etc/ansible/hosts এ থাকে, কিন্তু আপনি চাইলে প্রোজেক্ট ডিরেক্টরিতে বা কাস্টম লোকেশনে রাখতে পারেন।

ইনভেন্টরি ফাইলের ফরম্যাট

Ansible ইনভেন্টরি ফাইল সাধারণত দুটি ফরম্যাটে লেখা হয়:

  1. ইনিআই (INI) ফরম্যাট (সাধারণ টেক্সট ফাইল)
  2. ইয়ামল (YAML) ফরম্যাট

১. INI ফরম্যাটে ইনভেন্টরি ফাইল

INI ফরম্যাটে ইনভেন্টরি ফাইলের লেখার নিয়ম সহজ এবং এটি সাধারণত হোস্ট এবং গ্রুপের তালিকা আকারে লেখা হয়। নিচে একটি উদাহরণ দেওয়া হলো:

# হোস্টের তালিকা
192.168.1.10
webserver.example.com

# গ্রুপ দিয়ে হোস্ট সংগঠিত করা
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com
db2.example.com

# গ্রুপের ভেতরে ভ্যারিয়েবল
[webservers:vars]
ansible_user=ansible_user
ansible_ssh_private_key_file=~/.ssh/id_rsa

INI ফরম্যাট ব্যাখ্যা:

  • সাধারণ হোস্ট: সরাসরি IP বা হোস্টনেম লিখে দিলে Ansible সেগুলির সাথে কাজ করতে পারবে।
  • গ্রুপ: [] এর ভেতরে গ্রুপের নাম দিলে এবং তার নিচে হোস্টগুলির নাম দিলে Ansible সেই হোস্টগুলিকে একসাথে সেই গ্রুপ হিসেবে ধরবে।
  • গ্রুপ ভ্যারিয়েবল: [group_name:vars] দিয়ে আপনি গ্রুপের জন্য নির্দিষ্ট ভ্যারিয়েবল সেট করতে পারেন, যেমন ansible_user বা ansible_ssh_private_key_file

২. YAML ফরম্যাটে ইনভেন্টরি ফাইল

YAML ফরম্যাট আরো আধুনিক এবং ফ্লেক্সিবল। এটি বড় এবং জটিল ইনভেন্টরি ব্যবস্থাপনার জন্য উপযোগী। নিচে YAML ইনভেন্টরি ফাইলের একটি উদাহরণ দেওয়া হলো:

all:
  children:
    webservers:
      hosts:
        web1.example.com:
          ansible_user: ansible_user
        web2.example.com:
          ansible_user: ansible_user
    databases:
      hosts:
        db1.example.com:
          ansible_user: db_user
        db2.example.com:
          ansible_user: db_user
  vars:
    ansible_ssh_private_key_file: ~/.ssh/id_rsa

YAML ফরম্যাট ব্যাখ্যা:

  • all: এটি মূল গ্রুপ, যা সমস্ত হোস্ট এবং গ্রুপ অন্তর্ভুক্ত করে।
  • children: এর ভেতরে বিভিন্ন গ্রুপ রাখা হয়, যেমন webservers এবং databases
  • hosts: প্রতিটি গ্রুপের ভেতরে হোস্টগুলির নাম এবং তাদের জন্য নির্দিষ্ট ভ্যারিয়েবল দেওয়া হয়।
  • vars: গ্লোবাল ভ্যারিয়েবল যা সমস্ত হোস্টের জন্য প্রযোজ্য।

ইনভেন্টরি ফাইলের ব্যবহার

Ansible ইনভেন্টরি ফাইলটি ব্যবহার করে আপনি যেকোনো কমান্ড বা প্লেবুক রান করতে পারেন। উদাহরণস্বরূপ:

ansible all -i ./inventory -m ping
  • -i ./inventory: আপনার কাস্টম ইনভেন্টরি ফাইলটি নির্দেশ করে।
  • -m ping: ping মডিউল ব্যবহার করে সমস্ত হোস্ট চেক করা হয়।

ডায়নামিক ইনভেন্টরি

যদি আপনার হোস্টের সংখ্যা অনেক বেশি হয় এবং তাদের আইপি বা হোস্টনেমগুলো পরিবর্তনশীল হয়, তাহলে Ansible ডায়নামিক ইনভেন্টরি সমর্থন করে। ডায়নামিক ইনভেন্টরি ফাইল একটি স্ক্রিপ্ট বা প্লাগইন আকারে লেখা হয় যা রান টাইমে হোস্টের তথ্য জেনারেট করে।

সংক্ষেপে

  • INI ফরম্যাট: সাধারণ ও সহজ; ছোট থেকে মাঝারি আকারের ইনভেন্টরি ব্যবস্থাপনার জন্য উপযোগী।
  • YAML ফরম্যাট: জটিল ইনভেন্টরি ব্যবস্থাপনা এবং কাস্টমাইজেশনের জন্য উপযুক্ত।
  • ডায়নামিক ইনভেন্টরি: বড় বা পরিবর্তনশীল পরিবেশের জন্য উপযোগী।

এভাবেই আপনি Ansible ইনভেন্টরি ফাইল তৈরি এবং সেটআপ করে আপনার হোস্টগুলো সহজেই ম্যানেজ করতে পারবেন।

YAML ফরম্যাটের পরিচিতি

YAML ফরম্যাটের পরিচিতি

YAML (Yet Another Markup Language, বর্তমানে YAML Ain’t Markup Language) একটি হিউম্যান-রিডেবল ডেটা সিরিয়ালাইজেশন ভাষা যা কনফিগারেশন ফাইল, ডেটা স্টোরেজ এবং ডেটা এক্সচেঞ্জের জন্য ব্যবহৃত হয়। YAML এর মূল বৈশিষ্ট্য হলো এটি সহজবোধ্য, হিউম্যান-ফ্রেন্ডলি এবং পড়তে সহজ, যা JSON বা XML এর তুলনায় অনেক সহজ এবং কম জটিল। YAML সাধারণত কনফিগারেশন ফাইল (যেমন Docker Compose, Ansible, Kubernetes) এবং ডেটা ডিফিনিশনের ক্ষেত্রে ব্যবহৃত হয়।

YAML ফরম্যাটের মূল বৈশিষ্ট্য

  1. সাধারণ এবং হিউম্যান-রিডেবল: YAML এর সহজবোধ্য ফরম্যাট এটিকে হিউম্যান-রিডেবল করে তোলে। এটি কনফিগারেশন ফাইল বা ডেটা ডিফিনিশন পড়া এবং লেখা উভয়কেই সহজ করে।
  2. ইনডেন্টেশন নির্ভর: YAML ইনডেন্টেশন ব্যবহার করে হায়ারারকিক্যাল ডেটা উপস্থাপন করে, যা কোডের মতো স্ট্রাকচার প্রদান করে এবং পড়া সহজ করে।
  3. কমপ্লেক্স ডেটা টাইপ সমর্থন: YAML বিভিন্ন ধরনের ডেটা টাইপ (যেমন লিস্ট, ডিকশনারি, স্ট্রিং, নম্বর, বুলিয়ান) সমর্থন করে।
  4. JSON এর সাথে সামঞ্জস্যপূর্ণ: YAML এবং JSON একে অপরের সাথে সামঞ্জস্যপূর্ণ। YAML ফাইল সহজেই JSON এ রূপান্তরিত করা যায় এবং এর বিপরীতটিও সম্ভব।

YAML ফরম্যাটের উদাহরণ

নিচে একটি সাধারণ YAML ফাইলের উদাহরণ এবং তার ব্যাখ্যা দেওয়া হলো:

# একটি সাধারণ YAML ডকুমেন্ট
name: John Doe
age: 30
is_employee: true
address:
  street: 123 Main St
  city: New York
  zip_code: 10001
skills:
  - Python
  - JavaScript
  - Docker

YAML উদাহরণের ব্যাখ্যা:

  • কী-ভ্যালু পেয়ার: name: John Doe বা age: 30 এর মতো। এটি YAML এর সবচেয়ে মৌলিক ফরম্যাট।
  • নেস্টেড ডেটা: address এর ভেতরে আরও কী-ভ্যালু পেয়ার রয়েছে যা ইনডেন্টেশন দিয়ে উপস্থাপন করা হয়েছে। YAML ইনডেন্টেশন ব্যবহার করে নেস্টেড ডেটা বা ডিকশনারি তৈরির জন্য উপযুক্ত।
  • লিস্ট: skills ফিল্ড একটি লিস্ট যার মধ্যে একাধিক আইটেম রয়েছে। YAML-এ লিস্ট ডিফাইন করতে - সিম্বল ব্যবহার করা হয়।

YAML ফাইলের ব্যবহার

YAML ফাইল বিভিন্ন প্ল্যাটফর্ম এবং টুলে ব্যবহৃত হয়, যেমন:

  1. Ansible: YAML ফাইল ব্যবহার করে প্লেবুক তৈরি করা হয় যা কনফিগারেশন ম্যানেজমেন্ট এবং অটোমেশন টাস্কের জন্য ব্যবহৃত হয়।
  2. Docker Compose: Docker Compose YAML ফাইল ব্যবহার করে কনটেইনার স্ট্যাক ডিফাইন করা হয়।
  3. Kubernetes: Kubernetes YAML ফাইল ব্যবহার করে পড, সার্ভিস, এবং অন্যান্য অবজেক্ট কনফিগার করা হয়।
  4. CI/CD টুলস: YAML ফাইল বিভিন্ন Continuous Integration/Continuous Deployment (CI/CD) টুলে (যেমন GitLab CI, Jenkins, CircleCI) কনফিগারেশন সেটিংস সংরক্ষণ করতে ব্যবহৃত হয়।

YAML এর মৌলিক গঠন

YAML এর কিছু সাধারণ গঠন এবং সেগুলোর উদাহরণ:

  1. কী-ভ্যালু পেয়ার: 

key: value
 

    2. নেস্টেড ডিকশনারি:

parent_key:
 child_key: child_value

  3. লিস্ট/আরেই:

fruits:
 - apple
 - banana
 - orange

  4. মাল্টি-লাইন স্ট্রিং: | বা > ব্যবহার করে মাল্টি-লাইন স্ট্রিং সংরক্ষণ করা হয়।

description: |
 This is a multi-line string.
 It preserves line breaks.

YAML এর সুবিধা এবং সীমাবদ্ধতা

সুবিধা:

  • সহজবোধ্য এবং হিউম্যান-রিডেবল: YAML সহজবোধ্য এবং কনফিগারেশন ফাইল তৈরি ও মেইনটেইন করা সহজ।
  • JSON এর সাথে সামঞ্জস্যপূর্ণ: JSON এবং YAML একে অপরের সাথে ইন্টারচেঞ্জেবল, যা ডেটা ট্রান্সফারের ক্ষেত্রে সুবিধাজনক।
  • স্ট্রাকচারড ডেটা: ইনডেন্টেশন ব্যবহার করে নেস্টেড ডেটা গঠন করা সহজ।

সীমাবদ্ধতা:

  • ইনডেন্টেশন সেনসিটিভ: YAML ইনডেন্টেশন নির্ভর, তাই ভুল ইনডেন্টেশন এরর তৈরি করতে পারে।
  • কমপ্লেক্সিটি: YAML জটিল স্ট্রাকচার তৈরি করতে পারে, যা কোনো কোনো ক্ষেত্রে পড়তে বা মেইনটেইন করতে কঠিন হতে পারে।

উপসংহার

YAML একটি জনপ্রিয় ফরম্যাট যা কনফিগারেশন এবং ডেটা ডিফিনিশনের জন্য ব্যবহার করা হয়। এটি সহজবোধ্য, হিউম্যান-রিডেবল এবং JSON এর সাথে সামঞ্জস্যপূর্ণ হওয়ায়, এটি আধুনিক ডেভেলপমেন্ট পরিবেশে ব্যাপকভাবে ব্যবহৃত হচ্ছে। YAML এর মাধ্যমে আপনি সহজেই কনফিগারেশন ফাইল তৈরি ও পরিচালনা করতে পারবেন, যা আপনার ডেভেলপমেন্ট ও ডেপ্লয়মেন্ট প্রক্রিয়াকে সহজতর করবে।

Promotion